package sv.gob.mh.dgii.ssc.pi.renta.controller;

import com.octo.captcha.CaptchaException;
import com.octo.captcha.module.servlet.image.SimpleImageCaptchaServlet;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.SessionAttributes;
import sv.gob.mh.dgii.common.Utils;
import sv.gob.mh.dgii.model.EdDatoF11;
import sv.gob.mh.dgii.model.EdDatoF11Id;
import sv.gob.mh.dgii.model.RcRuc;
import sv.gob.mh.dgii.model.TbEstadoDecla;
import sv.gob.mh.dgii.model.TbListasValorDet;
import sv.gob.mh.dgii.model.TbListasValorDetId;
import sv.gob.mh.dgii.security.SscUserDetailsImpl;
import sv.gob.mh.dgii.service.cat.TbEstadoDeclaService;
import sv.gob.mh.dgii.service.cat.TbListasValorDetService;
import sv.gob.mh.dgii.service.cat.TbMensajesWebService;
import sv.gob.mh.dgii.service.ed.EdDatoF11Service;
import sv.gob.mh.dgii.service.rc.RcRucService;
import sv.gob.mh.dgii.ssc.constants.SSCConstants;
import sv.gob.mh.dgii.ssc.controller.configuration.MainController;
import sv.gob.mh.dgii.ssc.pi.renta.controller.form.ConsultaRentaForm;

/**
 *
 * @author reynaldo
 */
@Controller
@SessionAttributes({
    "sessionSSCMenu", "consultaRentaForm"})
public class ConsultaRentaController extends MainController {

    private final static String SESSION_MENU_NAME = "sessionSSCMenu";
    private static final long serialVersionUID = -4454262279890891762L;
    @Autowired
    private EdDatoF11Service edDatoF11Service;
    @Autowired
    private TbMensajesWebService tbMensajesWebService;
    @Autowired
    private TbListasValorDetService tbListasValorDetService;
    @Autowired
    private RcRucService rcRucService;
    @Autowired
    TbEstadoDeclaService tbEstadoDeclaService;
    private static final String ROOT_ACTION = SSCConstants.PI_ROOT + "renta/";
    private static final String TIPO_LISTADO = "mensajeWeb";
    private static final String DESCRIPCIONES = "descripciondevoluciones";
    Log log = LogFactory.getLog(ConsultaRentaController.class);

    @RequestMapping("/pr")
    public String home(HttpServletRequest request) {
        return "redirect:/pi/renta/";
    }

    @RequestMapping(value = SSCConstants.PI_ROOT + "renta/", method = RequestMethod.GET)
    public String index(HttpServletRequest request,
            Model model) {

        //ConsultaRentaForm consultaRentaForm = (ConsultaRentaForm) model.asMap().get("consultaRentaForm");

        //if (newSession(consultaRentaForm)) {
        ConsultaRentaForm consultaRentaForm = new ConsultaRentaForm();
        model.addAttribute("consultaRentaForm", consultaRentaForm);
        //}


        /*
         * Utilizado para desplegar tabla de rangos de devolucion de Renta
         */
        TbListasValorDet listaDto = new TbListasValorDet();
        listaDto.setId(new TbListasValorDetId());
        listaDto.getId().setCmodulo("SSC");
        listaDto.getId().setClista("MENSAJE_WEB_CONSULTA_RENTA");
        List<TbListasValorDet> lista = tbListasValorDetService.getListado(listaDto);
        model.addAttribute(TIPO_LISTADO, lista);

        List descripciondevoluciones;
        descripciondevoluciones = descripciondevoluciones = tbMensajesWebService.descripcionDevoluciones();
        model.addAttribute(DESCRIPCIONES, descripciondevoluciones);

        return ROOT_ACTION + "consultaRenta";
    }

    @RequestMapping(value = SSCConstants.PI_ROOT + "renta/query", method = RequestMethod.POST)
    public String query(HttpServletRequest request, Model model, @ModelAttribute(value = "consultaRentaForm") ConsultaRentaForm consultaRentaForm) {

        try {
            if (consultaRentaForm.getPeriodo().isEmpty()) {

                consultaRentaForm.addError("Debe de Ingresar el Periodo a Consultar.");
                return "redirect:/pi/renta/";
            }
            if (consultaRentaForm.getNit().isEmpty()) {
                consultaRentaForm.addError("Debe de Ingresar el Periodo a Consultar.");
                return "redirect:/pi/renta/";
            }

            String userCaptchaResponse = request.getParameter("jcaptcha");
            boolean captchaPassed = false;
            try {
                captchaPassed = SimpleImageCaptchaServlet.validateResponse(
                        request, userCaptchaResponse);
                if (!captchaPassed) {
                    consultaRentaForm.setResultado("");
                    consultaRentaForm.addError("Debe de Ingresar el Periodo a Consultar.");
                    return "redirect:/pi/renta/";
                }
            } catch (CaptchaException errorcap) {
                consultaRentaForm.addError("Error al generar Captcha");
                return "redirect:/pi/renta/";
            }

            SscUserDetailsImpl usuario = getPrincipal();
            boolean logueado = false;
            
            RcRuc contrib = rcRucService.findByNit(consultaRentaForm.getNit());
            edDatoF11Service.updateEstadoWithProcedure(consultaRentaForm.getNit(), consultaRentaForm.getPeriodo());

            String iconos = null;
            String fases = null;
            
            limpiarDetalle(consultaRentaForm);

            try {
                
                EdDatoF11Id edDatoF11Id = new EdDatoF11Id();
                edDatoF11Id.setNit(consultaRentaForm.getNit());
                edDatoF11Id.setFafiscal(consultaRentaForm.getPeriodo());
                
                EdDatoF11 edDatoF11 = (EdDatoF11) edDatoF11Service.findByEdDatoF11Id(edDatoF11Id);

                String estado = edDatoF11.getTbEstadoDecla().getCestado();

                TbEstadoDecla buscar = new TbEstadoDecla();
                buscar.setCestado(estado);
                TbEstadoDecla estadosActual = (TbEstadoDecla) tbEstadoDeclaService.findByKey(buscar);
                edDatoF11.setTbEstadoDecla(estadosActual);

                // Recepcion
                if (SSCConstants.ESTADO0.contains(estado)) {
                    iconos = "0.png";
                    fases = "FASES1.png";
                }
                // Registro
                if (SSCConstants.ESTADO1.contains(estado)) {
                    iconos = "1.jpg";
                    fases = "FASES2.png";
                }
                //
                if (SSCConstants.ESTADO2A.contains(estado)) {
                    iconos = "2A.jpg";
                    fases = "FASES3.png";

                }
                if (SSCConstants.ESTADO2B.contains(estado)) {
                    iconos = "2B.jpg";
                    fases = "FASES4.png";

                }
                if (SSCConstants.ESTADO3.contains(estado)) {
                    iconos = "3.png";
                    fases = "FASES5.png";
                }
                if (SSCConstants.ESTADO4.contains(estado)) {
                    iconos = "4.jpg";
                    fases = "FASES6.png";

                }
                if (SSCConstants.ESTADO5.contains(estado)) {
                    iconos = "5.png";
                    fases = "FASES7.png";

                }
                if (SSCConstants.ESTADO6.contains(estado)) {
                    iconos = "6.jpg";
                    fases = "FASES8.png";
                }

                consultaRentaForm.setIconos(iconos);
                consultaRentaForm.setFases(fases);

                if (estado.equals("C")) {
                    String cadenaErrroes = edDatoF11.getS_mensajes();
                    consultaRentaForm.setDescripcionErrores(tbMensajesWebService.descripcionErrores(cadenaErrroes));
                    consultaRentaForm.setOficinaErrores(tbMensajesWebService.oficinaErrores(cadenaErrroes));
                    consultaRentaForm.setDocumentosErrores(tbMensajesWebService.documentosErrores(cadenaErrroes));
                    consultaRentaForm.setEstado(estado);
                }

                if (logueado) {
                    consultaRentaForm.setResultado(Utils.nvl(edDatoF11.getTbEstadoDecla()
                            .getDdescriEstado(), "")
                            + " - "
                            + Utils.nvl(edDatoF11.getTbEstadoDecla().getSconcepto2(),
                            edDatoF11.getTbEstadoDecla().getSconcepto1()));
                } else {
                    consultaRentaForm.setResultado(Utils.nvl(edDatoF11.getTbEstadoDecla()
                            .getDdescriEstado(), "")
                            + " - "
                            + Utils.nvl(edDatoF11.getTbEstadoDecla().getSconcepto1(),
                            ""));
                }
            } catch (org.springframework.orm.ObjectRetrievalFailureException orfe) {
                consultaRentaForm.addError("Los datos ingresados no existen en nuestros registros, por favor verifique que la declaración consultada corresponde a una persona natural que solicita devolución");
                return "redirect:/pi/renta/";
            }

            if (contrib == null) {
                consultaRentaForm.setResultado("");
                consultaRentaForm.addError('"'
                        + "Los datos ingresados no existen en nuestros registros, por favor verifíquelo e intente de nuevo"
                        + '"'
                        + ".");
                consultaRentaForm.addError("NOTA: le rogamos tomar en cuenta que esta opción aplica únicamente para Personas Naturales con Devolución.");
                return "redirect:/pi/renta/";
            }
            
            model.addAttribute("consultaRentaForm", consultaRentaForm);
            return ROOT_ACTION + "query";


        } catch (Exception e) {
            return "redirect:/pi/renta/";
        }
    }

    protected void limpiarSession(Model model, ConsultaRentaForm consultaRentaForm) {
        consultaRentaForm = new ConsultaRentaForm();
    }

    protected boolean newSession(ConsultaRentaForm consultaRentaForm) {
        return consultaRentaForm == null || (consultaRentaForm != null && consultaRentaForm.getNit() == null);
    }

    private void limpiarDetalle(ConsultaRentaForm consultaRentaForm) {
        consultaRentaForm.setDescripcionErrores(null);
        consultaRentaForm.setOficinaErrores(null);
        consultaRentaForm.setDocumentosErrores(null);
        consultaRentaForm.setEstado(null);
    }
}
